這裡將利用教程所提供的"Treasure Hunter Game"來直接學習PixiJS中的語法。"Treasure Hunter Game"的程式碼 ---> Click Here !
系統提示:「You make the failure complete when you stop trying.」,PixiJS青銅玩家還卡關於自定義function階段,僅獲得經驗提昇等級。
今天將要寫一下JS的event。
function keyboard(keyCode) {
var key = {};
key.code = keyCode;
key.isDown = false;
key.isUp = true;
key.press = undefined;
key.release = undefined;
//The `downHandler`
key.downHandler = function(event) {
if (event.keyCode === key.code) {
if (key.isUp && key.press) key.press();
key.isDown = true;
key.isUp = false;
}
event.preventDefault();
};
//The `upHandler`
key.upHandler = function(event) {
if (event.keyCode === key.code) {
if (key.isDown && key.release) key.release();
key.isDown = false;
key.isUp = true;
}
event.preventDefault();
};
//Attach event listeners
window.addEventListener(
"keydown", key.downHandler.bind(key), false
);
window.addEventListener(
"keyup", key.upHandler.bind(key), false
);
return key;
}
主要是以下這個部份,因此想了解下JS的事件:
window.addEventListener(
"keydown", key.downHandler.bind(key), false
);
window.addEventListener(
"keyup", key.upHandler.bind(key), false
);
首先,先從事件綁定開始。
事件綁定(Event Handler)
大致分成3種方式:++Html inline atribute++、++DOM object property++、++addEventListener++
不過這裡主要提addEventListener,他一共有3個參數:
所以回到PIXIJS的Treasure Hunter Game 中,以其中一個監聽事件為例:
window.addEventListener(
"keydown", key.downHandler.bind(key), false
);
可以得知,當第一個參數「keydown」事件被觸發時,就會進入事件處理,執行第二個參數的函式「key.downHandler.bind(key)」,接著看到第三個參數傳入「false」(預設也是false,所以這裡有沒有放都沒差),而false的行為是冒泡,也就是由內而外觸發(true或false差別可以參考這篇stackoverflow-Why is 'false' used after this simple addEventListener function?)
再來,了解一下捕獲、冒泡,而這個就得提到事件流程「先捕獲再冒泡」。
事件流程(DOM Event Flow)
先了解在事件觸發後的事件流程是如何跑的(事件是如何被傳遞的)。
分成了3個階段(phase):++captrue phase++、++target phase++、++bubbling phase++
(1)captrue phase
(inner > outer)
root of the tree ---> target node
DOM Event運作時,會從根節點觸發,一路傳遞到target節點上。
(2)target phase
(會觸發2次)
到達target node的階段。
(3)bubbling phase
(outer > inner)
target node ---> root of the tree
DOM Event運作時,會從target節點觸發,一路傳遞到根節點上。
先捕獲,後冒泡
如下圖所示,假如我們<td>
上的click事件被觸發:
capture phase
會「先捕獲」,也就是從根節點Document出發,一路傳遞到此處的target<td>
的過程。
Document -> <html> -> <body> -> <table> -> <tbody> -> <tr> -> <td>
target phase
到達target<td>
時的階段。
bubbling phase
接著「後冒泡」,從target<td>
出發,一路傳遞到跟節點Document的過程。
<td> -> <tr> -> <tbody> -> <table> -> <body> -> <html> -> Document
(圖片來源:w3.org)
今天稍微理解下JS的事件流程,至於其中addEventListener()
的第二個參數「key.downHandler.bind(key)」或「key.upHandler.bind(key)」中的bind()
留到明天會好好得來理解的,再來的LV.27,28,29才是真正的挑戰...